Android 多媒体框架之音频录制 MediaRecorder 和 AudioRecorder 您所在的位置:网站首页 audiorecorder xs录音文件的路径 Android 多媒体框架之音频录制 MediaRecorder 和 AudioRecorder

Android 多媒体框架之音频录制 MediaRecorder 和 AudioRecorder

2024-02-14 09:04| 来源: 网络整理| 查看: 265

Android 多媒体框架针对音频录制提供了两种方法:MediaRecorder和AudioRecord。AudioRecord和MediaRecorder两种都可以录制音频,MediaRecorder已实现大量的封装,操作起来更加简单,而AudioRecord使用起来更加灵活,能实现更多的功能。需要注意的是,在使用 MediaRecorder 或 AudioRecorder 进行音频录制时,需要在 AndroidManifest.xml 文件中申请适当的权限,例如 RECORD_AUDIO 权限。

MediaRecorder

MediaRecorder(基于文件录音):已集成了录音,编码,压缩等,支持少量的音频格式文件。

优点:封装度很高,操作简单缺点:无法实现实时处理音频,输出的音频格式少。

MediaRecorder 录制的音频文件是经过压缩后的,需要设置编码器,并且录制的音频文件可以用系统自带的播放器播放。MediaRecorder属于系统API高度封装,所以可扩展性和可用性都比较局限,支持的格式过少并且无法实时处理音频数据,使用场景如语音消息录制等,值得一提的是MediaRecorder通常和视频录制一起使用。

MediaRecorder的使用

MediaRecorder:MediaRecorder 类提供了一种方便的方式来录制音频和视频。它可以用于录制音频文件、视频文件或同时录制音频和视频文件。以下是使用 MediaRecorder 录制音频的一般步骤:

创建一个 MediaRecorder 实例:使用 new MediaRecorder() 创建一个新的 MediaRecorder 对象。设置音频源:使用 setAudioSource() 方法设置音频源,例如麦克风。设置输出格式和输出文件:使用 setOutputFormat() 和 setOutputFile() 方法设置输出格式和输出文件路径。设置音频编码器:使用 setAudioEncoder() 方法设置音频编码器,例如 AAC、AMR-NB 等。调用 prepare() 方法进行准备:在开始录制之前,调用 prepare() 方法进行准备工作。开始录制:使用 start() 方法开始录制音频。停止录制:使用 stop() 方法停止录制音频。释放资源:使用 release() 方法释放 MediaRecorder 对象所占用的资源。 MediaRecorder 代码示例

使用 MediaRecorder 类,您可以设置音频源、输出格式、输出文件路径和音频编码器等参数。在示例中,我们将音频源设置为麦克风,输出格式为默认的 AMR_NB 格式,输出文件路径为设备的外部存储目录,并使用默认的 AMR 编码器进行音频编码。

startRecording() 方法用于开始录制音频,它创建 MediaRecorder 实例并进行必要的设置,然后准备录制并开始录制。

stopRecording() 方法用于停止录制音频,它停止录制并释放 MediaRecorder 的资源。

请注意,您需要在 AndroidManifest.xml 文件中声明适当的权限,例如 RECORD_AUDIO 和 WRITE_EXTERNAL_STORAGE 权限,以便您的应用可以访问麦克风和外部存储设备。

另外,请确保在使用完 MediaRecorder 后调用 release() 方法释放资源,以避免潜在的内存泄漏。

import android.media.MediaRecorder; import android.os.Environment; import java.io.IOException; public class AudioRecorder { private MediaRecorder mediaRecorder; private String outputFile; public void startRecording() { // 创建 MediaRecorder 实例 mediaRecorder = new MediaRecorder(); // 设置音频源为麦克风 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置输出格式为默认的三星声音 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); // 设置输出文件的路径 outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp"; mediaRecorder.setOutputFile(outputFile); // 设置音频编码器为默认的AMR编码器 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { // 准备录制 mediaRecorder.prepare(); // 开始录制 mediaRecorder.start(); } catch (IOException e) { e.printStackTrace(); } } public void stopRecording() { if (mediaRecorder != null) { // 停止录制 mediaRecorder.stop(); // 释放资源 mediaRecorder.release(); mediaRecorder = null; } } } MediaRecorder 可选参数

可选参数的可用性可能会因设备和 Android 版本而有所不同。在使用时,您可以根据具体需求选择适当的参数组合。对于更多可选参数和详细信息,建议查阅 Android 官方文档或相关开发资源。在 Android 的 MediaRecorder 类中,以下是一些常用的可选参数:

AudioSource(音频源): MediaRecorder.AudioSource.DEFAULT:默认音频源。MediaRecorder.AudioSource.MIC:麦克风音频源。MediaRecorder.AudioSource.CAMCORDER:摄像头音频源。MediaRecorder.AudioSource.VOICE_RECOGNITION:语音识别音频源。MediaRecorder.AudioSource.VOICE_COMMUNICATION:通话音频源。MediaRecorder.AudioSource.UNPROCESSED:未经处理的音频源。 OutputFormat(输出格式): MediaRecorder.OutputFormat.DEFAULT:默认输出格式。MediaRecorder.OutputFormat.THREE_GPP:3GP 文件格式。MediaRecorder.OutputFormat.MPEG_4:MPEG-4 文件格式。MediaRecorder.OutputFormat.AMR_NB:AMR-NB 文件格式。MediaRecorder.OutputFormat.AMR_WB:AMR-WB 文件格式。MediaRecorder.OutputFormat.AAC_ADTS:AAC ADTS 文件格式。MediaRecorder.OutputFormat.WEBM:WebM 文件格式。 AudioEncoder(音频编码器): MediaRecorder.AudioEncoder.DEFAULT:默认音频编码器。MediaRecorder.AudioEncoder.AMR_NB:AMR-NB 音频编码器。MediaRecorder.AudioEncoder.AMR_WB:AMR-WB 音频编码器。MediaRecorder.AudioEncoder.AAC:AAC 音频编码器。MediaRecorder.AudioEncoder.HE_AAC:高效 AAC(HE-AAC)音频编码器。MediaRecorder.AudioEncoder.AAC_ELD:AAC ELD 音频编码器。 AudioRecord

AudioRecord(基于字节流录音)

优点:可以实现语音的实时处理,进行边录边播,对音频的实时处理。缺点:输出的是PCM的语音数据,如果保存成音频文件是不能被播放器播放的。要用到AudioTrack这个去进行处理。

AudioRecord 主要实现对音频实时处理以及边录边播功能,录制的是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,需要用AudioTrack来播放,当然也可以对数据进行编码压缩,从而转换成我们常见的音频格式。使用的场景有实时音频传输,音视频录制处理等等,以后涉及到音视频编解码时会用到。

AudioRecorder 的使用

AudioRecorder:AudioRecorder 类提供了更底层的音频录制功能,允许开发者更加灵活地控制音频录制过程。以下是使用 AudioRecorder 录制音频的一般步骤:

创建一个 AudioRecorder 实例:使用 new AudioRecord() 创建一个新的 AudioRecorder 对象。配置录音参数:使用 setAudioSource() 方法设置音频源,setAudioFormat() 方法设置音频格式,setAudioEncoder() 方法设置音频编码器等。创建音频缓冲区:使用 getMinBufferSize() 方法获取最小的音频缓冲区大小,并使用 new byte[bufferSize] 创建音频缓冲区。开始录制:使用 startRecording() 方法开始录制音频。读取音频数据:使用 read() 方法从音频缓冲区读取音频数据。停止录制:使用 stop() 方法停止录制音频。释放资源:使用 release() 方法释放 AudioRecorder 对象所占用的资源。 AudioRecorder 代码示例

我们使用 AudioRecord 类来录制音频数据。在 startRecording() 方法中,我们创建了 AudioRecord 实例,并将音频源设置为麦克风。然后,我们将录制的音频数据写入到 PCM 格式的文件中。在 stopRecording() 方法中,我们停止录制,并将录制的 PCM 文件转换为 WAV 格式(可使用 WavUtil 等工具类进行转换)。

请注意,上述示例仅展示了如何使用 AudioRecord 录制音频数据,并将其写入到 PCM 文件中。要将 PCM 文件转换为其他音频格式(如 WAV、MP3 等),您需要使用相应的工具类或进行编码器操作。在示例中,我们在 convertPcmToWav() 方法中展示了将 PCM 文件转换为 WAV 格式的操作。

同时,请确保在 AndroidManifest.xml 文件中声明适当的权限,如 RECORD_AUDIO 和 WRITE_EXTERNAL_STORAGE 权限,以便您的应用可以访问麦克风和外部存储设备。

import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Environment; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class AudioRecorder { private static final int SAMPLE_RATE = 44100; // 采样率 private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO; // 音频通道:单声道 private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; // 音频格式:PCM 16位 private AudioRecord audioRecord; private boolean isRecording = false; private String outputFile; public void startRecording() { int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, bufferSize); outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.pcm"; audioRecord.startRecording(); isRecording = true; new Thread(new Runnable() { @Override public void run() { writeAudioDataToFile(); } }).start(); } public void stopRecording() { isRecording = false; if (audioRecord != null) { audioRecord.stop(); audioRecord.release(); audioRecord = null; } convertPcmToWav(outputFile); } private void writeAudioDataToFile() { byte[] buffer = new byte[1024]; FileOutputStream fos = null; try { fos = new FileOutputStream(outputFile); while (isRecording) { int read = audioRecord.read(buffer, 0, buffer.length); if (read > 0) { fos.write(buffer, 0, read); } } fos.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } private void convertPcmToWav(String pcmFile) { // 在此处进行将 PCM 文件转换为 WAV 格式的操作 // 可以使用 WavUtil 等工具类进行转换 } }

convertPcmToWav() 方法将接受 PCM 文件的路径作为输入,并将其转换为 WAV 文件,保存在指定的 WAV 文件路径中。在方法中,我们首先创建 WAV 文件的头部(WAV 文件格式的特定字节结构),然后将 PCM 数据追加到 WAV 文件中。

请注意,上述代码中生成的 WAV 文件头部是一个基本的 WAV 文件格式结构,仅适用于特定的参数设置(单声道、16 位 PCM 数据、44100 采样率等)。如果您需要根据不同的 PCM 文件参数进行动态调整,您可能需要更详细地了解 WAV 文件格式规范,并根据实际需求生成相应的头部。

此外,请确保在调用 convertPcmToWav() 方法之前已经完成了 PCM 文件的录制。调用此方法将转换现有的 PCM 文件为 WAV 格式,并将转换后的 WAV 文件保存到指定路径。

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class AudioConverter { public static void convertPcmToWav(String pcmFilePath, String wavFilePath) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(pcmFilePath); fos = new FileOutputStream(wavFilePath); // WAV 文件头部 byte[] header = createWavHeader(); // 写入 WAV 文件头部 fos.write(header); byte[] buffer = new byte[1024]; int bytesRead; // 逐个读取 PCM 数据并写入 WAV 文件 while ((bytesRead = fis.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } fos.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } private static byte[] createWavHeader() { short numChannels = 1; // 单声道 int sampleRate = 44100; // 采样率 short bitsPerSample = 16; // 位深度 int byteRate = sampleRate * numChannels * bitsPerSample / 8; short blockAlign = (short) (numChannels * bitsPerSample / 8); ByteBuffer buffer = ByteBuffer.allocate(44); buffer.order(ByteOrder.LITTLE_ENDIAN); // ChunkID(RIFF 标志) buffer.put(new byte[] {'R', 'I', 'F', 'F'}); // ChunkSize buffer.putInt(36); // 后续文件大小 // Format(WAVE 标志) buffer.put(new byte[] {'W', 'A', 'V', 'E'}); // Subchunk1ID(fmt 标志) buffer.put(new byte[] {'f', 'm', 't', ' '}); // Subchunk1Size(fmt 大小) buffer.putInt(16); // 固定为 16 // AudioFormat(音频格式,PCM 为 1) buffer.putShort((short) 1); // NumChannels(通道数) buffer.putShort(numChannels); // SampleRate(采样率) buffer.putInt(sampleRate); // ByteRate(码率) buffer.putInt(byteRate); // BlockAlign(块对齐) buffer.putShort(blockAlign); // BitsPerSample(位深度) buffer.putShort(bitsPerSample); // Subchunk2ID(data 标志) buffer.put(new byte[] {'d', 'a', 't', 'a'}); // Subchunk2Size(音频数据大小) buffer.putInt(0); // 之后填充 return buffer.array(); } } AudioRecorder 类可选参数

可选参数的可用性和支持取决于设备和 Android 版本。因此,建议在使用时检查设备的支持情况并根据需要进行选择。另外,要获取支持的参数列表,您可以使用相应的静态方法,如 AudioRecord.getMinBufferSize() 和 AudioRecord.getAudioSourceMax()。

AudioRecorder 类是 Android 提供的用于录制音频的类,其构造函数和一些常用的可选参数如下:

音频源(Audio Source): MediaRecorder.AudioSource.MIC:麦克风作为音频源。MediaRecorder.AudioSource.VOICE_COMMUNICATION:用于语音通信的音频源。MediaRecorder.AudioSource.VOICE_RECOGNITION:用于语音识别的音频源。MediaRecorder.AudioSource.CAMCORDER:摄像头作为音频源。MediaRecorder.AudioSource.DEFAULT:默认音频源。 采样率(Sample Rate): 44100:44.1kHz,即标准的音频 CD 质量。22050:22.05kHz。16000:16kHz。8000:8kHz。 音频通道配置(Channel Configuration): AudioFormat.CHANNEL_IN_MONO:单声道。AudioFormat.CHANNEL_IN_STEREO:立体声。 音频格式(Audio Format): AudioFormat.ENCODING_PCM_8BIT:8 位 PCM 编码。AudioFormat.ENCODING_PCM_16BIT:16 位 PCM 编码。AudioFormat.ENCODING_PCM_FLOAT:浮点型 PCM 编码。 相关参考

https://blog.csdn.net/zxyudia/article/details/68948751 https://github.com/dreamfish797/AudioRecorder AudioRecorder:https://www.jianshu.com/p/90c4071c7768 MediaRecorder:https://www.jianshu.com/p/de779d509e6c



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有